//package com.example.rabbitdemo.message;
//
//import com.rabbitmq.client.Channel;
//import org.springframework.amqp.rabbit.annotation.RabbitListener;
//import org.springframework.amqp.support.AmqpHeaders;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.messaging.handler.annotation.Header;
//import org.springframework.stereotype.Service;
//
//import java.io.IOException;
//import java.time.Duration;
//
//@Service
//public class IdempotentConsumer {
//
//    @Autowired
//    private RedisTemplate<String, String> redisTemplate;
//
//    @RabbitListener(queues = "my.queue")
//    public void handleMessage(OrderMessage message, Channel channel,
//                              @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) throws IOException {
//        String messageId = message.getMessageId();
//        String redisKey = "msg_idempotent:" + messageId;
//
//        // 幂等性校验：利用Redis setIfAbsent (SETNX)
//        Boolean isFirstProcess = redisTemplate.opsForValue().setIfAbsent(redisKey, "processing",
//                Duration.ofMinutes(10));
//        if (Boolean.FALSE.equals(isFirstProcess)) {
//            log.warn("消息已被消费，直接ACK以避免重复处理。MessageId: {}", messageId);
//            channel.basicAck(deliveryTag, false); // 直接确认，丢弃重复消息
//            return;
//        }
//
//        try {
//            // 正常的业务处理逻辑
//            orderService.createOrder(message);
//            channel.basicAck(deliveryTag, false);
//            // 业务处理成功后，可以删除或保留Redis键直至过期
//        } catch (Exception e) {
//            // 处理失败，NACK并重新入队重试。同时删除Redis键，允许下次重试时再次通过校验
//            redisTemplate.delete(redisKey);
//            channel.basicNack(deliveryTag, false, true);
//        }
//    }
//}